webrtc wpt: add cleanup to close peerconnections adds a pc.close() to all RTCPeerConnections in promise_test and async_test. This is codemod-powered by this: https://github.com/fippo/webrtc-codemods/blob/e844b2467cbb76a231c113366b2451cf248f53bc/wpt-rtcpeerconnection-no-helpers BUG=836871 Change-Id: Iee84ef938bf477a55612b6012c6de464c6aea55b Reviewed-on: https://chromium-review.googlesource.com/1049983 Commit-Queue: Henrik Boström <hbos@chromium.org> Reviewed-by: Henrik Boström <hbos@chromium.org> Cr-Commit-Position: refs/heads/master@{#565591} 
diff --git a/webrtc/RTCDTMFSender-insertDTMF.https.html b/webrtc/RTCDTMFSender-insertDTMF.https.html index 7a45e5d..9c0055b 100644 --- a/webrtc/RTCDTMFSender-insertDTMF.https.html +++ b/webrtc/RTCDTMFSender-insertDTMF.https.html 
@@ -109,6 +109,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio', {  direction: 'recvonly'  }); @@ -126,6 +127,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio', {  direction: 'inactive'  }); @@ -166,6 +168,7 @@  let dtmfSender;  let sender;  let pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  sender = pc.addTrack(track, mediaStream); 
diff --git a/webrtc/RTCDTMFSender-ontonechange.https.html b/webrtc/RTCDTMFSender-ontonechange.https.html index bfb8b8c..6beefb5 100644 --- a/webrtc/RTCDTMFSender-ontonechange.https.html +++ b/webrtc/RTCDTMFSender-ontonechange.https.html 
@@ -232,6 +232,7 @@  */  async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio', { direction: 'sendrecv' });  const dtmfSender = transceiver.sender.dtmf;   @@ -279,7 +280,6 @@    dtmfSender.addEventListener('tonechange', onToneChange);  dtmfSender.insertDTMF('ABCD', 100, 70); -  }, `Setting transceiver.currentDirection to recvonly in the middle of tonechange events should stop future tonechange events from firing`);    /* Section 7.3 - Tone change event */ 
diff --git a/webrtc/RTCDataChannel-id.html b/webrtc/RTCDataChannel-id.html index 7128da8..18f70d8 100644 --- a/webrtc/RTCDataChannel-id.html +++ b/webrtc/RTCDataChannel-id.html 
@@ -11,6 +11,7 @@  // have IDs set according to the rules in rtcweb-data-channel.  promise_test(test => {  const pc = new RTCPeerConnection; + test.add_cleanup(() => pc.close());  const channel = pc.createDataChannel('');  return pc.createOffer()  .then(offer => pc.setLocalDescription(offer)) @@ -35,6 +36,7 @@    promise_test(test => {  const pc = new RTCPeerConnection; + test.add_cleanup(() => pc.close());  const channel = pc.createDataChannel('');  return pc.createOffer()  .then(offer => pc.setLocalDescription(offer)) 
diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index 80d1bfa..0614364 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html 
@@ -38,7 +38,9 @@  */  async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close());    pc1.createDataChannel('test');  exchangeIceCandidates(pc1, pc2); 
diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 9163285..17ae6dc 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html 
@@ -120,7 +120,9 @@    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close());    return createDataChannelPair(pc1, pc2)  .then(([channel1, channel2]) => { @@ -165,7 +167,9 @@    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close());  pc1.createDataChannel('');    // setRemoteDescription(answer) without the other peer 
diff --git a/webrtc/RTCPeerConnection-addIceCandidate.html b/webrtc/RTCPeerConnection-addIceCandidate.html index e55cc61..5e32168 100644 --- a/webrtc/RTCPeerConnection-addIceCandidate.html +++ b/webrtc/RTCPeerConnection-addIceCandidate.html 
@@ -142,6 +142,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, new TypeError(), @@ -157,6 +159,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return promise_rejects(t, 'InvalidStateError',  pc.addIceCandidate({  candidate: candidateStr1, @@ -170,6 +174,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr1, @@ -180,6 +186,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate(new RTCIceCandidate({  candidate: candidateStr1, @@ -190,6 +198,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({ sdpMid }));  }, 'Add candidate with only valid sdpMid should succeed'); @@ -197,6 +207,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({ sdpMLineIndex }));  }, 'Add candidate with only valid sdpMLineIndex should succeed'); @@ -212,6 +224,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr1, @@ -226,6 +240,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr2, @@ -242,6 +258,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr1, @@ -257,6 +275,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr1, @@ -291,6 +311,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr1, @@ -318,6 +340,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, new TypeError(), @@ -331,6 +355,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, new TypeError(), @@ -342,6 +368,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, new TypeError(), @@ -355,6 +383,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, new TypeError(), @@ -364,6 +394,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, new TypeError(), @@ -385,6 +417,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, 'OperationError', @@ -405,6 +439,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, 'OperationError', @@ -420,6 +456,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr1, @@ -432,6 +470,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() => pc.addIceCandidate({  candidate: candidateStr2, @@ -455,6 +495,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, 'OperationError', @@ -475,6 +517,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, 'OperationError', @@ -487,6 +531,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(sessionDesc)  .then(() =>  promise_rejects(t, 'OperationError', 
diff --git a/webrtc/RTCPeerConnection-addTrack.https.html b/webrtc/RTCPeerConnection-addTrack.https.html index 406e2d7..c062739 100644 --- a/webrtc/RTCPeerConnection-addTrack.https.html +++ b/webrtc/RTCPeerConnection-addTrack.https.html 
@@ -40,6 +40,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -67,6 +69,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -102,6 +106,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -122,6 +128,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -149,6 +157,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); 
diff --git a/webrtc/RTCPeerConnection-canTrickleIceCandidates.html b/webrtc/RTCPeerConnection-canTrickleIceCandidates.html index 38c8b63..09ad677 100644 --- a/webrtc/RTCPeerConnection-canTrickleIceCandidates.html +++ b/webrtc/RTCPeerConnection-canTrickleIceCandidates.html 
@@ -38,6 +38,8 @@  promise_test(function(t) {  var pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp}))  .then(function() {  assert_true(pc.canTrickleIceCandidates, 'canTrickleIceCandidates property is true after setRemoteDescription'); @@ -47,6 +49,8 @@  promise_test(function(t) {  var pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp.replace('a=ice-options:trickle\r\n', '')}))  .then(function() {  assert_false(pc.canTrickleIceCandidates, 'canTrickleIceCandidates property is false after setRemoteDescription'); 
diff --git a/webrtc/RTCPeerConnection-connectionState.html b/webrtc/RTCPeerConnection-connectionState.html index 1f2f1b7..d8e9411 100644 --- a/webrtc/RTCPeerConnection-connectionState.html +++ b/webrtc/RTCPeerConnection-connectionState.html 
@@ -107,8 +107,11 @@  */  async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const onConnectionStateChange = t.step_func(() => {  const { connectionState } = pc1;  if(connectionState === 'connected') { @@ -136,7 +139,6 @@    exchangeIceCandidates(pc1, pc2);  doSignalingHandshake(pc1, pc2); -  }, 'connection with one data channel should eventually have connected connection state');    /* 
diff --git a/webrtc/RTCPeerConnection-createAnswer.html b/webrtc/RTCPeerConnection-createAnswer.html index 19b3a45..abff1eb 100644 --- a/webrtc/RTCPeerConnection-createAnswer.html +++ b/webrtc/RTCPeerConnection-createAnswer.html 
@@ -24,6 +24,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return promise_rejects(t, 'InvalidStateError',  pc.createAnswer());  }, 'createAnswer() with null remoteDescription should reject with InvalidStateError'); @@ -36,6 +37,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({ offerToReceiveVideo: true })  .then(offer => pc.setRemoteDescription(offer))  .then(() => pc.createAnswer()) @@ -51,6 +54,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return generateOffer({ pc, data: true })  .then(offer => pc.setRemoteDescription(offer))  .then(() => { 
diff --git a/webrtc/RTCPeerConnection-createDataChannel.html b/webrtc/RTCPeerConnection-createDataChannel.html index 35e22f9..450a250 100644 --- a/webrtc/RTCPeerConnection-createDataChannel.html +++ b/webrtc/RTCPeerConnection-createDataChannel.html 
@@ -362,6 +362,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const channel1 = pc.createDataChannel('channel');  assert_equals(channel1.id, null,  'Expect initial id to be null'); 
diff --git a/webrtc/RTCPeerConnection-createOffer-offerToReceive.html b/webrtc/RTCPeerConnection-createOffer-offerToReceive.html index c599b1c..dd1827a 100644 --- a/webrtc/RTCPeerConnection-createOffer-offerToReceive.html +++ b/webrtc/RTCPeerConnection-createOffer-offerToReceive.html 
@@ -21,6 +21,7 @@  // Start testing  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const dummy = pc.createDataChannel('foo'); // Just to have something to offer    return pc.createOffer(offerToReceiveFalse) @@ -33,6 +34,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer(offerToReceiveTrue)  .then(() => {  assert_equals(pc.getTransceivers().length, 1, @@ -47,6 +50,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer(offerToReceiveTrue)  .then(() => {  assert_equals(pc.getTransceivers().length, 1, @@ -67,6 +72,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return getTrackFromUserMedia(kind)  .then(([track, stream]) => {  pc.addTrack(track, stream); @@ -91,6 +98,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return getTrackFromUserMedia(kind)  .then(([track, stream]) => {  pc.addTrack(track, stream); @@ -110,6 +119,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  pc.addTransceiver(kind, {direction: 'recvonly'});    return pc.createOffer(offerToReceiveFalse) @@ -126,8 +137,11 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  return getTrackFromUserMedia(kind)  .then(([track, stream]) => {  pc.addTrack(track, stream); @@ -154,6 +168,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true })  .then(() => {  assert_equals(pc.getTransceivers().length, 2, 
diff --git a/webrtc/RTCPeerConnection-createOffer.html b/webrtc/RTCPeerConnection-createOffer.html index 4b4d0ea..936fd05 100644 --- a/webrtc/RTCPeerConnection-createOffer.html +++ b/webrtc/RTCPeerConnection-createOffer.html 
@@ -30,6 +30,8 @@  promise_test(t => {  const pc = new RTCPeerConnection()   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer => {  assert_equals(typeof offer, 'object', @@ -42,6 +44,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -61,6 +64,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  pc.close();    return promise_rejects(t, 'InvalidStateError', @@ -81,6 +85,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const promise = pc.createOffer();    pc.addTransceiver('audio'); @@ -125,6 +130,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({ offerToReceiveAudio: true })  .then(offer1 => {  assert_equals(countAudioLine(offer1.sdp), 1, @@ -152,6 +159,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({ offerToReceiveVideo: true })  .then(offer1 => {  assert_equals(countVideoLine(offer1.sdp), 1, @@ -168,6 +177,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({  offerToReceiveAudio: true,  offerToReceiveVideo: false 
diff --git a/webrtc/RTCPeerConnection-getStats.https.html b/webrtc/RTCPeerConnection-getStats.https.html index ac69ee5..e9ea7da 100644 --- a/webrtc/RTCPeerConnection-getStats.https.html +++ b/webrtc/RTCPeerConnection-getStats.https.html 
@@ -41,11 +41,13 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.getStats();  }, 'getStats() with no argument should succeed');    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.getStats(null);  }, 'getStats(null) should succeed');   @@ -59,6 +61,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  return promise_rejects(t, 'InvalidAccessError', pc.getStats(track)); @@ -67,6 +70,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  pc.addTrack(track, mediaStream); @@ -76,6 +80,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack();  pc.addTransceiver(track);   @@ -84,6 +89,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  // addTransceiver allows adding same track multiple times @@ -100,6 +106,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver1 = pc.addTransceiver('audio');    // Create another transceiver that resends what @@ -117,6 +124,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.getStats()  .then(statsReport => {  validateStatsReport(statsReport); @@ -126,6 +134,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  pc.addTrack(track, mediaStream); @@ -140,6 +149,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  pc.addTrack(track); @@ -162,6 +172,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return getTrackFromUserMedia('audio')  .then(([track, mediaStream]) => {  pc.addTrack(track, mediaStream); @@ -185,6 +196,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio');    return pc.getStats(transceiver.receiver.track) 
diff --git a/webrtc/RTCPeerConnection-iceConnectionState.html b/webrtc/RTCPeerConnection-iceConnectionState.html index 59c964c..4071033 100644 --- a/webrtc/RTCPeerConnection-iceConnectionState.html +++ b/webrtc/RTCPeerConnection-iceConnectionState.html 
@@ -104,8 +104,11 @@  */  async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const onIceConnectionStateChange = t.step_func(() => {  const { iceConnectionState } = pc1;   @@ -138,7 +141,6 @@    exchangeIceCandidates(pc1, pc2);  doSignalingHandshake(pc1, pc2); -  }, 'connection with one data channel should eventually have connected connection state');    /* 
diff --git a/webrtc/RTCPeerConnection-iceGatheringState.html b/webrtc/RTCPeerConnection-iceGatheringState.html index 4265b8b..fb9e514 100644 --- a/webrtc/RTCPeerConnection-iceGatheringState.html +++ b/webrtc/RTCPeerConnection-iceGatheringState.html 
@@ -57,6 +57,8 @@  async_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  const onIceGatheringStateChange = t.step_func(() => {  const { iceGatheringState } = pc;   @@ -74,7 +76,6 @@  .then(offer => pc.setLocalDescription(offer))  .then(err => t.step_func(err =>  assert_unreached(`Unhandled rejection ${err.name}: ${err.message}`))); -  }, 'iceGatheringState should eventually become complete after setLocalDescription');    /* @@ -97,8 +98,11 @@  */  async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const onIceGatheringStateChange = t.step_func(() => {  const { iceGatheringState } = pc2;   @@ -131,7 +135,6 @@    exchangeIceCandidates(pc1, pc2);  doSignalingHandshake(pc1, pc2); -  }, 'connection with one data channel should eventually have connected connection state');    /* 
diff --git a/webrtc/RTCPeerConnection-ondatachannel.html b/webrtc/RTCPeerConnection-ondatachannel.html index 4948d11..1070ee7 100644 --- a/webrtc/RTCPeerConnection-ondatachannel.html +++ b/webrtc/RTCPeerConnection-ondatachannel.html 
@@ -36,8 +36,11 @@  */  async_test(t => {  const localPc = new RTCPeerConnection(); + t.add_cleanup(() => localPc.close());  const remotePc = new RTCPeerConnection();   + t.add_cleanup(() => remotePc.close()); +  let eventCount = 0;    const onDataChannel = t.step_func_done(event => { @@ -69,7 +72,6 @@  remotePc.addEventListener('datachannel', onDataChannel);  exchangeIceCandidates(localPc, remotePc);  doSignalingHandshake(localPc, remotePc); -  }, 'datachannel event should fire when new data channel is announced to the remote peer');    /* @@ -98,8 +100,11 @@  */  async_test(t => {  const localPc = new RTCPeerConnection(); + t.add_cleanup(() => localPc.close());  const remotePc = new RTCPeerConnection();   + t.add_cleanup(() => remotePc.close()); +  const onDataChannel = t.step_func_done(event => {  const remoteChannel = event.channel;  assert_true(remoteChannel instanceof RTCDataChannel, @@ -145,8 +150,11 @@  */  async_test(t => {  const localPc = new RTCPeerConnection(); + t.add_cleanup(() => localPc.close());  const remotePc = new RTCPeerConnection();   + t.add_cleanup(() => remotePc.close()); +  const onDataChannel = t.unreached_func('datachannel event should not be fired');    localPc.createDataChannel('test', { @@ -158,7 +166,6 @@  doSignalingHandshake(localPc, remotePc);    t.step_timeout(t.step_func_done(), 200); -  }, 'Data channel created with negotiated set to true should not fire datachannel event on remote peer');    /* 
diff --git a/webrtc/RTCPeerConnection-onnegotiationneeded.html b/webrtc/RTCPeerConnection-onnegotiationneeded.html index a71625c..8f9ea2b 100644 --- a/webrtc/RTCPeerConnection-onnegotiationneeded.html +++ b/webrtc/RTCPeerConnection-onnegotiationneeded.html 
@@ -82,6 +82,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const negotiated = awaitNegotiation(pc);    pc.createDataChannel('test'); @@ -114,6 +115,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const negotiated = awaitNegotiation(pc);    pc.addTransceiver('audio'); @@ -184,6 +186,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return assert_first_promise_fulfill_after_second(  awaitNegotiation(pc),  pc.createOffer({ offerToReceiveAudio: true }) 
diff --git a/webrtc/RTCPeerConnection-ontrack.https.html b/webrtc/RTCPeerConnection-ontrack.https.html index 6610139..1021012 100644 --- a/webrtc/RTCPeerConnection-ontrack.https.html +++ b/webrtc/RTCPeerConnection-ontrack.https.html 
@@ -98,6 +98,8 @@  async_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  // Fail the test if the ontrack event handler is not implemented  assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');   @@ -151,6 +153,8 @@  async_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');    const sdp = `v=0 @@ -182,13 +186,15 @@  .then(t.step_func(() => {  t.step_timeout(t.step_func_done(), 100);  })); -  }, 'setRemoteDescription() with m= line of recvonly direction should not trigger track event');    async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  pc2.ontrack = t.step_func(trackEvent => {  const { track } = trackEvent;   @@ -210,13 +216,15 @@  .catch(t.step_func(err => {  assert_unreached('Error ' + err.name + ': ' + err.message);  })); -  }, 'addTrack() should cause remote connection to fire ontrack when setRemoteDescription()');    async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  pc2.ontrack = t.step_func(trackEvent => {  const { track } = trackEvent;   @@ -235,13 +243,15 @@  .catch(t.step_func(err => {  assert_unreached('Error ' + err.name + ': ' + err.message);  })); -  }, `addTransceiver('video') should cause remote connection to fire ontrack when setRemoteDescription()`);    async_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  pc2.ontrack = t.step_func(trackEvent => {  const { track } = trackEvent;   @@ -264,7 +274,6 @@  .then(t.step_func(() => {  t.step_timeout(t.step_func_done(), 100);  })); -  }, `addTransceiver() with inactive direction should not cause remote connection to fire ontrack when setRemoteDescription()`);    </script> 
diff --git a/webrtc/RTCPeerConnection-peerIdentity.html b/webrtc/RTCPeerConnection-peerIdentity.html index 68d9f20..64ad212 100644 --- a/webrtc/RTCPeerConnection-peerIdentity.html +++ b/webrtc/RTCPeerConnection-peerIdentity.html 
@@ -56,8 +56,11 @@  */  promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const port = window.location.port;  const [idpDomain] = getIdpDomains();  const idpHost = hostString(idpDomain, port); @@ -92,10 +95,13 @@  const idpHost = hostString(idpDomain, port);    const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection({  peerIdentity: `bob@${idpDomain}`  });   + t.add_cleanup(() => pc2.close()); +  pc1.setIdentityProvider(idpHost, {  protocol: 'mock-idp.js',  usernameHint: `alice@${idpDomain}` @@ -131,10 +137,13 @@  const idpHost = hostString(idpDomain, port);    const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection({  peerIdentity: `alice@${idpDomain}`  });   + t.add_cleanup(() => pc2.close()); +  // Ask mockidp.js to return custom contents in validation result  pc1.setIdentityProvider(idpHost, {  protocol: 'mock-idp.js?validatorAction=return-custom-contents&contents=bogus', @@ -167,10 +176,13 @@  const idpHost1 = hostString(idpDomain1, port);    const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection({  peerIdentity: `alice@${idpDomain2}`  });   + t.add_cleanup(() => pc2.close()); +  // mock-idp.js will return assertion of domain2 identity  // with domain1 in the idp.domain field  pc1.setIdentityProvider(idpHost1, { @@ -220,10 +232,13 @@  const idpHost = hostString(idpDomain, port);    const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection({  peerIdentity: `alice@${idpDomain}`  });   + t.add_cleanup(() => pc2.close()); +  // Ask mock-idp.js to throw error during validation,  // i.e. during pc2.setRemoteDescription()  pc1.setIdentityProvider(idpHost, { @@ -263,8 +278,11 @@  */  promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const port = window.location.port;  const [idpDomain] = getIdpDomains();  const idpHost = hostString(idpDomain, port); 
diff --git a/webrtc/RTCPeerConnection-removeTrack.https.html b/webrtc/RTCPeerConnection-removeTrack.https.html index e2da02b..7db0afc 100644 --- a/webrtc/RTCPeerConnection-removeTrack.https.html +++ b/webrtc/RTCPeerConnection-removeTrack.https.html 
@@ -49,6 +49,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -78,6 +80,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -111,6 +115,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -149,6 +155,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return navigator.mediaDevices.getUserMedia({ audio: true })  .then(mediaStream => {  const tracks = mediaStream.getTracks(); @@ -173,6 +181,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');  const transceiver = pc.addTransceiver(track);  const { sender } = transceiver; @@ -205,6 +214,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');  const transceiver = pc.addTransceiver(track, { direction: 'sendonly' });  const { sender } = transceiver; @@ -237,6 +247,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');  const transceiver = pc.addTransceiver(track, { direction: 'recvonly' });  const { sender } = transceiver; @@ -268,6 +279,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');  const transceiver = pc.addTransceiver(track, { direction: 'inactive' });  const { sender } = transceiver; 
diff --git a/webrtc/RTCPeerConnection-setDescription-transceiver.html b/webrtc/RTCPeerConnection-setDescription-transceiver.html index d19b474..5fc957d 100644 --- a/webrtc/RTCPeerConnection-setDescription-transceiver.html +++ b/webrtc/RTCPeerConnection-setDescription-transceiver.html 
@@ -66,6 +66,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio');  assert_equals(transceiver.mid, null);   @@ -99,8 +100,11 @@  */  promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const transceiver1 = pc1.addTransceiver('audio');  assert_array_equals(pc1.getTransceivers(), [transceiver1]);  assert_array_equals(pc2.getTransceivers(), []); @@ -139,6 +143,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio');  assert_equals(transceiver.mid, null);   @@ -159,6 +164,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver1 = pc.addTransceiver('audio');  assert_equals(transceiver1.mid, null);   @@ -204,8 +210,11 @@  */  promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  pc1.addTransceiver('audio');    return pc1.createOffer() 
diff --git a/webrtc/RTCPeerConnection-setLocalDescription-answer.html b/webrtc/RTCPeerConnection-setLocalDescription-answer.html index b216e95..64b6901 100644 --- a/webrtc/RTCPeerConnection-setLocalDescription-answer.html +++ b/webrtc/RTCPeerConnection-setLocalDescription-answer.html 
@@ -60,6 +60,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -94,6 +95,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({ offerToReceiveVideo: true })  .then(offer =>  pc.setRemoteDescription(offer) @@ -123,6 +126,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer({ offerToReceiveVideo: true })  .then(offer =>  pc.setRemoteDescription(offer) @@ -145,16 +150,19 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer =>  promise_rejects(t, 'InvalidStateError',  pc.setLocalDescription({ type: 'answer', sdp: offer.sdp }))); -  }, 'Calling setLocalDescription(answer) from stable state should reject with InvalidStateError');    promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer =>  pc.setLocalDescription(offer) 
diff --git a/webrtc/RTCPeerConnection-setLocalDescription-offer.html b/webrtc/RTCPeerConnection-setLocalDescription-offer.html index 563ab09..d8cb813 100644 --- a/webrtc/RTCPeerConnection-setLocalDescription-offer.html +++ b/webrtc/RTCPeerConnection-setLocalDescription-offer.html 
@@ -57,6 +57,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -82,6 +83,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.createOffer({ offerToReceiveAudio: true })  .then(offer =>  pc.setLocalDescription({ type: 'offer' }) @@ -102,8 +104,11 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  return generateOffer({ pc, data: true })  .then(offer =>  promise_rejects(t, 'InvalidModificationError', @@ -116,6 +121,7 @@  // last offer, setLocalDescription would reject when setting  // with the first offer  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.createOffer({ offerToReceiveAudio: true })  .then(offer1 =>  pc.createOffer({ offerToReceiveVideo: true }) @@ -128,6 +134,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); 
diff --git a/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html b/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html index 134f3d1..8b173c4 100644 --- a/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html +++ b/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html 
@@ -63,11 +63,12 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer =>  promise_rejects(t, 'InvalidStateError',  pc.setLocalDescription({ type: 'pranswer', sdp: offer.sdp }))); -  }, 'setLocalDescription(pranswer) from stable state should reject with InvalidStateError');    /* @@ -80,6 +81,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -112,6 +114,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -133,6 +136,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); 
diff --git a/webrtc/RTCPeerConnection-setLocalDescription-rollback.html b/webrtc/RTCPeerConnection-setLocalDescription-rollback.html index 951a8f2..45ee0cc 100644 --- a/webrtc/RTCPeerConnection-setLocalDescription-rollback.html +++ b/webrtc/RTCPeerConnection-setLocalDescription-rollback.html 
@@ -57,6 +57,7 @@  */  promise_test(t=> {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -96,12 +97,14 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return promise_rejects(t, 'InvalidStateError',  pc.setLocalDescription({ type: 'rollback' }));  }, `setLocalDescription(rollback) from stable state should reject with InvalidStateError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.createOffer({ offerToReceiveAudio: true })  .then(offer =>  pc.setRemoteDescription(offer) @@ -115,6 +118,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.createOffer()  .then(offer => pc.setLocalDescription(offer))  .then(() => pc.setLocalDescription({ 
diff --git a/webrtc/RTCPeerConnection-setLocalDescription.html b/webrtc/RTCPeerConnection-setLocalDescription.html index 899f4bf..078a6ff 100644 --- a/webrtc/RTCPeerConnection-setLocalDescription.html +++ b/webrtc/RTCPeerConnection-setLocalDescription.html 
@@ -45,6 +45,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -73,6 +74,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -93,7 +95,6 @@    assert_array_equals(states, ['have-remote-offer', 'stable', 'have-local-offer']);  }))); -  }, 'Switching role from answerer to offerer after going back to stable state should succeed');    promise_test(async t => { 
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription-answer.html b/webrtc/RTCPeerConnection-setRemoteDescription-answer.html index 38407d7..30c7e43 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription-answer.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription-answer.html 
@@ -59,6 +59,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -98,6 +99,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer =>  promise_rejects(t, 'InvalidStateError', @@ -107,6 +110,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer =>  pc.setRemoteDescription(offer) @@ -114,7 +119,6 @@  .then(answer =>  promise_rejects(t, 'InvalidStateError',  pc.setRemoteDescription(answer))); -  }, 'Calling setRemoteDescription(answer) from have-remote-offer state should reject with InvalidStateError');    </script> 
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription-offer.html b/webrtc/RTCPeerConnection-setRemoteDescription-offer.html index b732500..c35bdb4 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription-offer.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription-offer.html 
@@ -51,9 +51,11 @@    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  pc1.createDataChannel('datachannel');    const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close());    const states = [];  pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState)); @@ -70,13 +72,15 @@  assert_equals(states, ['have-remote-offer']);  });  }); - }, 'setRemoteDescription with valid offer should succeed'); + }, 'setRemoteDescription with valid offer should succeed');    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  pc1.createDataChannel('datachannel');    const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close());    const states = [];  pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState)); @@ -98,9 +102,11 @@    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  pc1.createDataChannel('datachannel');    const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close());    const states = [];  pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState)); @@ -138,6 +144,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.setRemoteDescription({  type: 'offer',  sdp: 'Invalid SDP' @@ -165,6 +173,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.createOffer()  .then(offer => {  return pc.setLocalDescription(offer) 
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html b/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html index e9dc959..d1073c8 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html 
@@ -63,6 +63,8 @@  promise_test(t => {  const pc = new RTCPeerConnection();   + t.add_cleanup(() => pc.close()); +  return pc.createOffer()  .then(offer =>  promise_rejects(t, 'InvalidStateError', @@ -79,6 +81,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -109,6 +112,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -130,6 +134,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); 
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html b/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html index 06408d0..6c98eae 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html 
@@ -12,6 +12,7 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  return getUserMediaTracksAndStreams(2)  .then(t.step_func(([tracks, streams]) => {  const sender = caller.addTrack(tracks[0], streams[0]); @@ -28,6 +29,7 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  return getUserMediaTracksAndStreams(1)  .then(t.step_func(([tracks, streams]) => {  const sender = caller.addTrack(tracks[0], streams[0]); @@ -44,6 +46,7 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  return getUserMediaTracksAndStreams(2)  .then(t.step_func(([tracks, streams]) => {  const sender = caller.addTrack(tracks[0], streams[0]); @@ -62,6 +65,7 @@  async_test(t => {  const expectedException = 'InvalidStateError';  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  return getUserMediaTracksAndStreams(2)  .then(t.step_func(([tracks, streams]) => {  const sender = caller.addTrack(tracks[0], streams[0]); @@ -84,6 +88,7 @@  async_test(t => {  const expectedException = 'InvalidModificationError';  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  return getUserMediaTracksAndStreams(2)  .then(t.step_func(([tracks, streams]) => {  const sender = caller.addTrack(tracks[0], streams[0]); @@ -108,6 +113,7 @@  async_test(t => {  const expectedException = 'InvalidModificationError';  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  return getUserMediaTracksAndStreams(2)  .then(t.step_func(([tracks, streams]) => {  const sender = caller.addTrack(tracks[0], streams[0]); 
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html b/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html index 1c6c414..f677723 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html 
@@ -58,6 +58,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());    const states = [];  pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState)); @@ -96,12 +97,14 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return promise_rejects(t, 'InvalidStateError',  pc.setRemoteDescription({ type: 'rollback' }));  }, `setRemoteDescription(rollback) from stable state should reject with InvalidStateError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  return pc.createOffer({ offerToReceiveAudio: true })  .then(offer => pc.setRemoteDescription(offer))  .then(() => pc.setRemoteDescription({ 
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html b/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html index fd55ad0..251d282 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html 
@@ -19,7 +19,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true});  caller.addTrack(localStream.getTracks()[0]); @@ -34,7 +36,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true});  caller.addTrack(localStream.getTracks()[0], localStream); @@ -53,7 +57,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let eventSequence = '';  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true}); @@ -69,7 +75,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStreams = await Promise.all([  navigator.mediaDevices.getUserMedia({audio: true}),  navigator.mediaDevices.getUserMedia({audio: true}), @@ -110,7 +118,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let eventSequence = '';  const localStreams = await Promise.all([  navigator.mediaDevices.getUserMedia({audio: true}), @@ -140,7 +150,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let eventSequence = '';  const localStreams = await Promise.all([  navigator.mediaDevices.getUserMedia({audio: true}), @@ -168,7 +180,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStreams = await Promise.all([  navigator.mediaDevices.getUserMedia({audio: true}),  navigator.mediaDevices.getUserMedia({audio: true}), @@ -194,7 +208,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true});  caller.addTrack(localStream.getTracks()[0]); @@ -208,7 +224,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true});  const sender = caller.addTrack(localStream.getTracks()[0]); @@ -223,7 +241,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true});  const sender = caller.addTrack(localStream.getTracks()[0], localStream); @@ -247,7 +267,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let eventSequence = '';  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true}); @@ -272,7 +294,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true});  const sender = caller.addTrack(localStream.getTracks()[0], localStream); @@ -294,7 +318,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let eventSequence = '';  const localStream =  await navigator.mediaDevices.getUserMedia({audio: true}); @@ -319,6 +345,7 @@    promise_test(async t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const stream = await navigator.mediaDevices.getUserMedia({audio: true});  const sender = pc.addTrack(stream.getTracks()[0]);  pc.removeTrack(sender); 
diff --git a/webrtc/RTCPeerConnection-track-stats.https.html b/webrtc/RTCPeerConnection-track-stats.https.html index 9b5de30..682e7e5 100644 --- a/webrtc/RTCPeerConnection-track-stats.https.html +++ b/webrtc/RTCPeerConnection-track-stats.https.html 
@@ -19,6 +19,7 @@    async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let track;  return getUserMediaTracksAndStreams(1)  .then(t.step_func(([tracks, streams]) => { @@ -43,6 +44,7 @@    async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let stream;  return getUserMediaTracksAndStreams(1)  .then(t.step_func(([tracks, streams]) => { @@ -64,6 +66,7 @@    async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let track;  return getUserMediaTracksAndStreams(1)  .then(t.step_func(([tracks, streams]) => { @@ -90,6 +93,7 @@    async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let stream;  return getUserMediaTracksAndStreams(1)  .then(t.step_func(([tracks, streams]) => { @@ -117,6 +121,7 @@    async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let track;  let stream;  return getUserMediaTracksAndStreams(1) @@ -155,6 +160,7 @@  // https://github.com/w3c/webrtc-pc/issues/1125  async_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let track;  let stream;  return getUserMediaTracksAndStreams(1) @@ -189,7 +195,9 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let sendingTrack;  return getUserMediaTracksAndStreams(1)  .then(t.step_func(([tracks, streams]) => { @@ -217,7 +225,9 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let receivingTrack;  callee.ontrack = trackEvent => {  assert_true(receivingTrack == undefined, 'ontrack has not fired before'); @@ -249,7 +259,9 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let sendingTrack1;  let sendingTrack2;  let sender; @@ -276,7 +288,9 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let sendingTrack1;  let sendingTrack2;  let sender; @@ -311,7 +325,9 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let sendingTrack1;  let sendingTrack2;  let sender; @@ -345,7 +361,9 @@    async_test(t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let sendingTrack1;  let sendingTrack2;  let sender; @@ -380,7 +398,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let [tracks, streams] = await getUserMediaTracksAndStreams(2);  let sender = caller.addTrack(tracks[0], streams[0]);  callee.addTrack(tracks[1], streams[1]); @@ -426,7 +446,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let [tracks, streams] = await getUserMediaTracksAndStreams(2);  let sender = caller.addTrack(tracks[0], streams[0]);  callee.addTrack(tracks[1], streams[1]); @@ -472,7 +494,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let [tracks, streams] = await getUserMediaTracksAndStreams(2);  let sender = caller.addTrack(tracks[0], streams[0]);  callee.addTrack(tracks[1], streams[1]); @@ -497,7 +521,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  let [tracks, streams] = await getUserMediaTracksAndStreams(2);  let sender = caller.addTrack(tracks[0], streams[0]);  callee.addTrack(tracks[1], streams[1]); @@ -523,6 +549,7 @@    promise_test(async t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let [tracks, streams] = await getUserMediaTracksAndStreams(1);  await promise_rejects(t, 'InvalidAccessError', pc.getStats(tracks[0]));  }, 'RTCPeerConnection.getStats(track) throws InvalidAccessError when there ' + @@ -530,6 +557,7 @@    promise_test(async t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  let [tracks, streams] = await getUserMediaTracksAndStreams(2);  let sender1 = pc.addTrack(tracks[0]);  let sender2 = pc.addTrack(tracks[1]); 
diff --git a/webrtc/RTCRtpParameters-codecs.html b/webrtc/RTCRtpParameters-codecs.html index 58cad8a..4ce76d1 100644 --- a/webrtc/RTCRtpParameters-codecs.html +++ b/webrtc/RTCRtpParameters-codecs.html 
@@ -82,6 +82,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -96,11 +97,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, 'setParameters() with codec.payloadType modified should reject with InvalidModificationError');    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -115,11 +116,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, 'setParameters() with codec.mimeType modified should reject with InvalidModificationError');    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -134,11 +135,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, 'setParameters() with codec.clockRate modified should reject with InvalidModificationError');    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -153,12 +154,12 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, 'setParameters() with codec.channels modified should reject with InvalidModificationError');      promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -173,12 +174,12 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, 'setParameters() with codec.sdpFmtpLine modified should reject with InvalidModificationError');      promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -194,11 +195,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, 'setParameters() with new codecs inserted should reject with InvalidModificationError');    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -213,11 +214,11 @@  }    return sender.setParameters(param); -  }, 'setParameters with reordered codecs should succeed');    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -227,7 +228,6 @@  param.codecs = codecs.slice(1);    return sender.setParameters(param); -  }, 'setParameters with dropped codec should succeed');    </script> 
diff --git a/webrtc/RTCRtpParameters-degradationPreference.html b/webrtc/RTCRtpParameters-degradationPreference.html index 8d0ab7e..e2c92bc 100644 --- a/webrtc/RTCRtpParameters-degradationPreference.html +++ b/webrtc/RTCRtpParameters-degradationPreference.html 
@@ -42,6 +42,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -63,6 +64,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); 
diff --git a/webrtc/RTCRtpParameters-encodings.html b/webrtc/RTCRtpParameters-encodings.html index 5a9630e..00c2f47 100644 --- a/webrtc/RTCRtpParameters-encodings.html +++ b/webrtc/RTCRtpParameters-encodings.html 
@@ -192,6 +192,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -205,11 +206,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `sender.setParameters() with mismatch number of encodings should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -218,11 +219,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `sender.setParameters() with encodings unset should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -240,11 +241,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified encoding.ssrc field should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -262,11 +263,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified encoding.rtx field should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -284,11 +285,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified encoding.fec field should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio', {  sendEncodings: [{ rid: 'foo' }],  }); @@ -302,7 +303,6 @@  encoding.rid = 'bar';  return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified encoding.rid field should reject with InvalidModificationError`);    /* @@ -313,6 +313,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -322,11 +323,11 @@  encoding.scaleResolutionDownBy = 0.5;  return promise_rejects(t, 'RangeError',  sender.setParameters(param)); -  }, `setParameters() with encoding.scaleResolutionDownBy field set to less than 1.0 should reject with RangeError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -342,13 +343,13 @@    assert_approx_equals(encoding.scaleResolutionDownBy, 1.5, 0.01);  }); -  }, `setParameters() with encoding.scaleResolutionDownBy field set to greater than 1.0 should succeed`);    // Helper function to test that modifying an encoding field should succeed  function test_modified_encoding(field, value1, value2, desc) {  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio', {  sendEncodings: [{  [field]: value1 
diff --git a/webrtc/RTCRtpParameters-headerExtensions.html b/webrtc/RTCRtpParameters-headerExtensions.html index ed6b1e6..5cec059 100644 --- a/webrtc/RTCRtpParameters-headerExtensions.html +++ b/webrtc/RTCRtpParameters-headerExtensions.html 
@@ -57,6 +57,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');  const param = sender.getParameters();  validateSenderRtpParameters(param); @@ -69,7 +70,6 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified headerExtensions should reject with InvalidModificationError`);    </script> 
diff --git a/webrtc/RTCRtpParameters-rtcp.html b/webrtc/RTCRtpParameters-rtcp.html index 94d5afd..c40edf2 100644 --- a/webrtc/RTCRtpParameters-rtcp.html +++ b/webrtc/RTCRtpParameters-rtcp.html 
@@ -56,6 +56,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -75,11 +76,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified rtcp.cname should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -99,7 +100,6 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `setParameters() with modified rtcp.reducedSize should reject with InvalidModificationError`);    </script> 
diff --git a/webrtc/RTCRtpParameters-transactionId.html b/webrtc/RTCRtpParameters-transactionId.html index 184cdb5..02413fe 100644 --- a/webrtc/RTCRtpParameters-transactionId.html +++ b/webrtc/RTCRtpParameters-transactionId.html 
@@ -85,6 +85,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -95,11 +96,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -109,11 +110,11 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param)); -  }, `sender.setParameters() with transaction ID unset should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param = sender.getParameters(); @@ -123,11 +124,11 @@  .then(() =>  promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param))); -  }, `setParameters() twice with the same parameters should reject with InvalidModificationError`);    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const { sender } = pc.addTransceiver('audio');    const param1 = sender.getParameters(); @@ -140,7 +141,6 @@    return promise_rejects(t, 'InvalidModificationError',  sender.setParameters(param1)); -  }, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`);    </script> 
diff --git a/webrtc/RTCRtpReceiver-getContributingSources.https.html b/webrtc/RTCRtpReceiver-getContributingSources.https.html index 7ddc7e8..8ddff5b 100644 --- a/webrtc/RTCRtpReceiver-getContributingSources.https.html +++ b/webrtc/RTCRtpReceiver-getContributingSources.https.html 
@@ -40,8 +40,11 @@    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const ontrackPromise = new Promise(resolve => {  pc2.addEventListener('track', trackEvent => {  const { receiver } = trackEvent; 
diff --git a/webrtc/RTCRtpReceiver-getStats.https.html b/webrtc/RTCRtpReceiver-getStats.https.html index 4da0b0a..30b1585 100644 --- a/webrtc/RTCRtpReceiver-getStats.https.html +++ b/webrtc/RTCRtpReceiver-getStats.https.html 
@@ -46,7 +46,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const { receiver } = caller.addTransceiver('audio');    await doSignalingHandshake(caller, callee); @@ -57,7 +59,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const stream = await navigator.mediaDevices.getUserMedia({audio:true});  const [track] = stream.getTracks();  caller.addTrack(track, stream); 
diff --git a/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html b/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html index 236ec8b..8068558 100644 --- a/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html +++ b/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html 
@@ -27,8 +27,11 @@    promise_test(t => {  const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close());  const pc2 = new RTCPeerConnection();   + t.add_cleanup(() => pc2.close()); +  const ontrackPromise = new Promise(resolve => {  pc2.addEventListener('track', trackEvent => {  const { receiver } = trackEvent; 
diff --git a/webrtc/RTCRtpSender-getStats.https.html b/webrtc/RTCRtpSender-getStats.https.html index a20304d..a0e2b9d 100644 --- a/webrtc/RTCRtpSender-getStats.https.html +++ b/webrtc/RTCRtpSender-getStats.https.html 
@@ -41,7 +41,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const { sender } = caller.addTransceiver('audio');    await doSignalingHandshake(caller, callee); @@ -52,7 +54,9 @@    promise_test(async t => {  const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close());  const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close());  const stream = await navigator.mediaDevices.getUserMedia({audio:true});  const [track] = stream.getTracks();  const sender = caller.addTrack(track, stream); 
diff --git a/webrtc/RTCRtpSender-replaceTrack.html b/webrtc/RTCRtpSender-replaceTrack.html index 587ca57..f7f83f2 100644 --- a/webrtc/RTCRtpSender-replaceTrack.html +++ b/webrtc/RTCRtpSender-replaceTrack.html 
@@ -33,6 +33,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');    const transceiver = pc.addTransceiver('audio'); @@ -41,7 +42,6 @@    return promise_rejects(t, 'InvalidStateError',  sender.replaceTrack(track)); -  }, 'Calling replaceTrack on closed connection should reject with InvalidStateError');    /* @@ -52,6 +52,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('video');    const transceiver = pc.addTransceiver('audio'); @@ -59,7 +60,6 @@    return promise_rejects(t, new TypeError(),  sender.replaceTrack(track)); -  }, 'Calling replaceTrack with track of different kind should reject with TypeError');    /* @@ -69,6 +69,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');    const transceiver = pc.addTransceiver('audio'); @@ -77,7 +78,6 @@    return promise_rejects(t, 'InvalidStateError',  sender.replaceTrack(track)); -  }, 'Calling replaceTrack on stopped sender should reject with InvalidStateError');    /* @@ -88,6 +88,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');    const transceiver = pc.addTransceiver('audio'); @@ -102,6 +103,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track1 = generateMediaStreamTrack('audio');  const track2 = generateMediaStreamTrack('audio');   @@ -118,6 +120,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');    const transceiver = pc.addTransceiver(track); @@ -144,6 +147,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track = generateMediaStreamTrack('audio');    const transceiver = pc.addTransceiver(track); @@ -173,6 +177,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track1 = generateMediaStreamTrack('audio');  const track2 = generateMediaStreamTrack('audio');   @@ -204,6 +209,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const track1 = generateMediaStreamTrack('audio');  const track2 = generateMediaStreamTrack('audio');   
diff --git a/webrtc/RTCRtpSender-setParameters.html b/webrtc/RTCRtpSender-setParameters.html index d8fbe35..1278737 100644 --- a/webrtc/RTCRtpSender-setParameters.html +++ b/webrtc/RTCRtpSender-setParameters.html 
@@ -16,6 +16,7 @@  */  promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio');  const { sender } = transceiver;   @@ -24,7 +25,6 @@    return promise_rejects(t, 'InvalidStateError',  sender.setParameters(param)); -  }, `setParameters() when transceiver is stopped should reject with InvalidStateError`);    </script> 
diff --git a/webrtc/RTCRtpTransceiver-setDirection.html b/webrtc/RTCRtpTransceiver-setDirection.html index 00cddce..32cbff5 100644 --- a/webrtc/RTCRtpTransceiver-setDirection.html +++ b/webrtc/RTCRtpTransceiver-setDirection.html 
@@ -56,6 +56,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });  assert_equals(transceiver.direction, 'recvonly');  assert_equals(transceiver.currentDirection, null); 
diff --git a/webrtc/RTCSctpTransport-constructor.html b/webrtc/RTCSctpTransport-constructor.html index 347aa0e..c415c3f 100644 --- a/webrtc/RTCSctpTransport-constructor.html +++ b/webrtc/RTCSctpTransport-constructor.html 
@@ -41,6 +41,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);  pc.createDataChannel('test');   @@ -65,6 +66,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);    return generateOffer({ pc, data: true }) 
diff --git a/webrtc/RTCSctpTransport-maxMessageSize.html b/webrtc/RTCSctpTransport-maxMessageSize.html index d7f8362..28d17ee 100644 --- a/webrtc/RTCSctpTransport-maxMessageSize.html +++ b/webrtc/RTCSctpTransport-maxMessageSize.html 
@@ -45,6 +45,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);  let maxMessageSize;   @@ -69,6 +70,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);    return generateOffer({ pc, data: true }) @@ -97,6 +99,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);    return generateOffer({ pc, data: true }) @@ -118,6 +121,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);    return generateOffer({ pc, data: true }) @@ -152,6 +156,7 @@    promise_test(t => {  const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close());  assert_equals(pc.sctp, null);  const largerThanCanSendSize = canSendSize + 1;